﻿/*
题目：课程表

你这个学期必须选修 numCourses 门课程，记为 0 到 numCourses - 1 。

在选修某些课程之前需要一些先修课程。 先修课程按数组 prerequisites 给出，其中 prerequisites[i] = [ai, bi] ，表示如果要学习课程 ai 则 必须 先学习课程  bi 。

例如，先修课程对 [0, 1] 表示：想要学习课程 0 ，你需要先完成课程 1 。
请你判断是否可能完成所有课程的学习？如果可以，返回 true ；否则，返回 false 。

https://leetcode.cn/problems/course-schedule/description/
*/

#include <iostream>
#include <string>
#include <vector>
#include <list>
#include "TreeNode.hpp"
#include <map>
#include <set>
#include <stack>
#include <queue>
#include <unordered_map>
#include <unordered_set>
#include <algorithm>
#include <functional>

using namespace std;

class Solution {
public:
    bool canFinish(int n, vector<vector<int>>& course) {
        vector<vector<bool>> G(n, vector<bool>(n, false));
        vector<int> in_degree(n, 0);

        for (int i = 0; i < course.size(); i++) {
            int u = course[i][0], v = course[i][1];
            G[u][v] = true;
            in_degree[v] ++;
        }

        queue<int> q;
        for (int i = 0; i < n; i++)
            if (in_degree[i] == 0)  q.push(i);

        int s = 0;
        while (!q.empty()) {
            int u = q.front();
            q.pop();

            for (int v = 0; v < n; v++) {
                if (G[u][v]) {
                    if (--in_degree[v] == 0)   q.push(v);
                }
            }
            s++;
        }

        return s == n;
    }
};